import base from "@/config/baseUrl";
import store from '@/store';

// 初始化请求配置
uni.$u.http.setConfig((config) => {
    /* config 为默认全局配置*/
    // #ifdef H5
    config.baseURL = window.location.origin + "/api";
    // #endif
	// #ifndef H5
	config.baseURL = base.baseUrl; /* 根域名 */
	// #endif
    config.header = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Basic dW5pYXBwOnVuaWFwcF9zZWNyZXQ='
    }
    config.custom = {
        load:true,//是否显示加载动画
        isFactory: true,//true:返回的数据成功只返回data  false:返回response
        catch: true,//默认数据返回不成功进入catch返回
		auth: true,	//默认需要token
    }
    return config
})

// 请求拦截
uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
    // 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
    config.data = config.data || {}

	// console.log("config",config)
    // 根据custom参数中配置的是否需要token，添加对应的请求头
    let userToken = uni.getStorageSync('userToken');
    if(config?.custom?.auth && userToken) {
        config.header.userToken = userToken;
        config.header['Blade-Member-Auth'] = userToken
    }
    // console.log("请求开始", config);
    if (config?.custom?.load) {
        //打开加载动画
        store.commit("setLoadingShow", true);
    }
    return config
}, config => { // 可使用async await 做异步操作
    return Promise.reject(config)
})

// 响应拦截
uni.$u.http.interceptors.response.use((response) => { /* 对响应成功做点什么 可使用async await 做异步操作*/
    // 关闭加载动画
    store.commit("setLoadingShow", false);

    const data = response.data
    // 自定义参数
    const custom = response.config?.custom
    if(data.code == 200 && data.success == true){
        if(!custom.isFactory){
            return data
        }else{
            return data.data === undefined ? {} : data.data
        }
    }else if(data.code == 401){
        // 清空登录信息
        store.commit("emptyUserInfo");
        return new Promise(() => {})
    }else{
        // 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
        if (custom.toast !== false) {
            uni.$u.toast(data.message || data.msg)
        }
        // 如果需要catch返回，则进行reject
        if (custom?.catch) {
            return Promise.reject(data)
        } else {
            // 否则返回一个pending中的promise，请求不会进入catch中
            return new Promise(() => {})
        }
    }
}, (response) => {
    // 关闭加载动画
    store.commit("setLoadingShow", false);
	const custom = response.config?.custom;
    // 对响应错误做点什么（statusCode !== 200）
    let errorData = '网络异常，请稍后再试';
    let message = response.message || response.data.msg;
    if(message == "request:fail url not in domain list") {
        errorData = '检查请求域名是否添加了域名白名单'
    }else if (message == 'request:fail timeout') {
        errorData = '请求超时:请检查网络';
    }else{
        errorData = message || '网络异常，请稍后再试'
    }
	if (custom.toast !== false) {
	     uni.$u.toast(errorData)
	}
	// 跳转到服务器连接错误页面
	uni.navigateTo({
		url: "/pages/error/server"
	});
    return Promise.reject(response)
})
